#####################################################################################
#MAP
#####################################################################################
def map(models, ticket, log):
	from prepare import fetch
	data = fetch()
	for i in data:
		unit = models.unit()
		unit.ticket = ticket
		unit.meta = i
		unit.save()

	ticket.mapped = True
	ticket.save()

#####################################################################################
#REDUCE
#####################################################################################
def reduce(models, ticket, log):
	mysqllib = __import__('mysqllib')
	db = mysqllib.DB()
	units = models.unit.objects.filter(ticket=ticket,status__gte=0)
	for unit in units:
		for line in unit.meta.split('\n'):
			line = line.split(' ')
			if len(line) == 3:
				d = {'velocity':line[2]}
				w = {'street':line[0],'xtime':str(line[1])}
				print db.update('forecast', d, w)
		ticket.result_data +=unit.meta+'\n'
		unit.delete()
	ticket.save()
	sql = 'COMMIT;'
	r = db.plain(sql)

#####################################################################################
#COMPUTE
#####################################################################################
def compute(unit):
	import numpy as np
	import pickle, base64, scipy, os, datetime

	from pybrain.tools.shortcuts import buildNetwork
	from pybrain.structure import *
	from pybrain.datasets import SupervisedDataSet
	from pybrain.supervised.trainers import BackpropTrainer

	################ DATABASE INPUT INTERFACE ##########################
	print 'fetching data...'
	full_data = pickle.loads(unit.meta.encode('ascii'))
	street = full_data['street']
	data = full_data['data']
	forecast = full_data['forecast']
	####################################################################

	################ SETUP ##########################
	step = 8
	day_limit = 31

	inputs = (step-1) * 90 + 30
	hidden = inputs/4
	outputs = 60
	learningrate_=0.01
	lrdecay_=1
	momentum_=0.0
	weightdecay_=0
	training_steps = 80
	#################################################
	td = datetime.timedelta(hours=18)
	ds = SupervisedDataSet(inputs, outputs)

	print 'building datasets...'
	the_pattern = None
	for t in xrange(step+11,day_limit+12):
		tdata = np.array([])
		for day in xrange(t-step,t):
			tdata = np.hstack((tdata,data[day]))
		if t < day_limit+11:
			ds.addSample(tdata[:inputs], tdata[inputs:])
		else:
			the_pattern = tdata

	net = buildNetwork(inputs, hidden, outputs, hiddenclass=SigmoidLayer, fast=False)
	trainer = BackpropTrainer(net, ds, learningrate=learningrate_, lrdecay=lrdecay_, momentum=momentum_, weightdecay=weightdecay_, verbose=False)
	print 'training...'
	for x in xrange(1,training_steps):
		train = trainer.train()
		print '#',x,' > ',train
		if float(train) <= 1:
			break

	################ FILE OUTPUT INTERFACE ##########################
	nout = net.activate(the_pattern[:inputs])
	unit.meta = ''
	for fc in forecast:
		index = round((fc.seconds - td.seconds)/240)
		pattern = '%s %s %s' % (street,fc,nout[index])
		unit.meta += pattern+'\n'
	####################################################################
	return unit
